package com.itlaobing.reflection.method;

import com.itlaobing.reflection.loader.ItlaobingClassLoader;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 1、java.lang.reflect.Method实例 表示 方法
 * 2、获得单个方法: getMethod( String , Class<?>... ) / getDeclaredMethod( String , Class<?>... )
 */
public class GetMethodTest2 {

    public static void main(String[] args) throws Exception {

        final String base = "D:/test";
        String name = "com.itlaobing.reflection.Child";
        ClassLoader loader = new ItlaobingClassLoader(base);
        Class<?> aClass = Class.forName(name , true ,loader);

        // 从 aClass类 的所有 public 方法 及 从父类中继承的 public 方法 中获取 指定名称、指定参数列表的方法
        Method m1 = aClass.getMethod( "wait" , long.class );
        System.out.println( m1 );

        System.out.println( "- - - - - - - - - - - - - - - - - - - -" );

        Method m2 = aClass.getMethod( "showFourth" );
        System.out.println( m2 );

        System.out.println( "- - - - - - - - - - - - - - - - - - - -" );

        // 从 aClass类 中获取所有的方法(只要是该类声明的方法都获取，不考虑访问修饰符的影响)
        Method m3 = aClass.getDeclaredMethod("divide" , long.class , long.class);
        System.out.println(m3);

        System.out.println( "- - - - - - - - - - - - - - - - - - - -" );

        int mod = m3.getModifiers();// 获取修饰符
        String modifiers = Modifier.toString(mod);
        System.out.println(modifiers);

        Class<?> rt = m3.getReturnType();// 获取返回类型
        System.out.println(rt.getName() + 1);
        System.out.println(rt.getSimpleName()+2);
        System.out.println(rt.getCanonicalName()+3);

        String methodName = m3.getName(); // 获取方法名
        System.out.println(methodName);

        Class<?>[] pts = m3.getParameterTypes();
        for (Class<?> pt : pts) {
            System.out.println(pt.getSimpleName());
        }
    }
}
